<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: Upscaling images: single-output</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="../../d3/d81/tutorial_contrib_root.html">Tutorials for contrib modules</a></li><li class="navelem"><a class="el" href="../../d8/df8/tutorial_table_of_content_dnn_superres.html">Super Resolution using CNNs</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Upscaling images: single-output </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>In this tutorial you will learn how to use the 'dnn_superres' interface to upscale an image via pre-trained neural networks. It works in C++ and Python.</p>
<h2>Building </h2>
<p>When building OpenCV, run the following command to build all the contrib module:</p>
<div class="fragment"><div class="line">cmake -D OPENCV_EXTRA_MODULES_PATH=&lt;opencv_contrib&gt;/modules/</div></div><!-- fragment --><p>Or only build the dnn_superres module:</p>
<div class="fragment"><div class="line">cmake -D OPENCV_EXTRA_MODULES_PATH=&lt;opencv_contrib&gt;/modules/dnn_superres</div></div><!-- fragment --><p>Or make sure you check the dnn_superres module in the GUI version of CMake: cmake-gui.</p>
<h2>Source Code of the sample </h2>
<p>You can run the sample code by doing</p>
<div class="fragment"><div class="line">&lt;path_of_your_opencv_build_directory&gt;/bin/example_dnn_superres_dnn_superres &lt;path_to_image.png&gt; &lt;algo_string&gt; &lt;upscale_int&gt; &lt;model_path.pb&gt;</div></div><!-- fragment --><p>Example:</p>
<div class="fragment"><div class="line">/home/opencv/build/bin/example_dnn_superres_dnn_superres /home/image.png edsr 2 /home/EDSR_x2.pb</div></div><!-- fragment --><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">// This file is part of OpenCV project.</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// It is subject to the license terms in the LICENSE file found in the top-level directory</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// of this distribution and at http://opencv.org/license.html.</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="../../d3/db0/dnn__superres_8hpp.html">opencv2/dnn_superres.hpp</a>&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="../../d1/d4f/imgproc_2include_2opencv2_2imgproc_8hpp.html">opencv2/imgproc.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="../../d4/dd5/highgui_8hpp.html">opencv2/highgui.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="keyword">using namespace </span>std;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="keyword">using namespace </span>dnn;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="keyword">using namespace </span>dnn_superres;</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;{</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;    <span class="comment">// Check for valid command line arguments, print usage</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;    <span class="comment">// if insufficient arguments were given.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;    <span class="keywordflow">if</span> ( argc &lt; 4 ) {</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;        cout &lt;&lt; <span class="stringliteral">&quot;usage:   Arg 1: image     | Path to image&quot;</span> &lt;&lt; endl;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;        cout &lt;&lt; <span class="stringliteral">&quot;\t Arg 2: algorithm | bilinear, bicubic, edsr, espcn, fsrcnn or lapsrn&quot;</span> &lt;&lt; endl;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;        cout &lt;&lt; <span class="stringliteral">&quot;\t Arg 3: scale     | 2, 3 or 4 \n&quot;</span>;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;        cout &lt;&lt; <span class="stringliteral">&quot;\t Arg 4: path to model file \n&quot;</span>;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;        <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    }</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    <span class="keywordtype">string</span> img_path = string(argv[1]);</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;    <span class="keywordtype">string</span> algorithm = string(argv[2]);</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="keywordtype">int</span> scale = atoi(argv[3]);</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="keywordtype">string</span> path = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keywordflow">if</span>( argc &gt; 4)</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;        path = string(argv[4]);</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="comment">// Load the image</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> img = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv::imread</a>(img_path);</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> original_img(img);</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;    <span class="keywordflow">if</span> ( img.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#abbec3525a852e77998aba034813fded4">empty</a>() )</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;    {</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;        std::cerr &lt;&lt; <span class="stringliteral">&quot;Couldn&#39;t load image: &quot;</span> &lt;&lt; img &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        <span class="keywordflow">return</span> -2;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    }</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="comment">//Make dnn super resolution instance</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    DnnSuperResImpl sr;</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> img_new;</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordflow">if</span>( algorithm == <span class="stringliteral">&quot;bilinear&quot;</span> ){</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        <a class="code" href="../../d5/df1/group__imgproc__hal__functions.html#ga2fe39d2201b12e1b961ca56b2aff9ff2">resize</a>(img, img_new, <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(), scale, scale, 2);</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    }</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>( algorithm == <span class="stringliteral">&quot;bicubic&quot;</span> )</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    {</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        <a class="code" href="../../d5/df1/group__imgproc__hal__functions.html#ga2fe39d2201b12e1b961ca56b2aff9ff2">resize</a>(img, img_new, <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(), scale, scale, 3);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    }</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>( algorithm == <span class="stringliteral">&quot;edsr&quot;</span> || algorithm == <span class="stringliteral">&quot;espcn&quot;</span> || algorithm == <span class="stringliteral">&quot;fsrcnn&quot;</span> || algorithm == <span class="stringliteral">&quot;lapsrn&quot;</span> )</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    {</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;        sr.readModel(path);</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        sr.setModel(algorithm, scale);</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;        sr.upsample(img, img_new);</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    }</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    <span class="keywordflow">else</span>{</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;        std::cerr &lt;&lt; <span class="stringliteral">&quot;Algorithm not recognized. \n&quot;</span>;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    }</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    <span class="keywordflow">if</span> ( img_new.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#abbec3525a852e77998aba034813fded4">empty</a>() )</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    {</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;        std::cerr &lt;&lt; <span class="stringliteral">&quot;Upsampling failed. \n&quot;</span>;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;        <span class="keywordflow">return</span> -3;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    }</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    cout &lt;&lt; <span class="stringliteral">&quot;Upsampling succeeded. \n&quot;</span>;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    <span class="comment">// Display image</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">cv::namedWindow</a>(<span class="stringliteral">&quot;Initial Image&quot;</span>, <a class="code" href="../../d0/d90/group__highgui__window__flags.html#ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f">WINDOW_AUTOSIZE</a>);</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    <a class="code" href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">cv::imshow</a>(<span class="stringliteral">&quot;Initial Image&quot;</span>, img_new);</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;    <span class="comment">//cv::imwrite(&quot;./saved.jpg&quot;, img_new);</span></div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;    <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv::waitKey</a>(0);</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;}</div><div class="ttc" id="group__imgcodecs_html_ga288b8b3da0892bd651fce07b3bbd3a56"><div class="ttname"><a href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv::imread</a></div><div class="ttdeci">Mat imread(const String &amp;filename, int flags=IMREAD_COLOR)</div><div class="ttdoc">Loads an image from a file. </div></div>
<div class="ttc" id="highgui_8hpp_html"><div class="ttname"><a href="../../d4/dd5/highgui_8hpp.html">highgui.hpp</a></div></div>
<div class="ttc" id="group__highgui_html_ga453d42fe4cb60e5723281a89973ee563"><div class="ttname"><a href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">cv::imshow</a></div><div class="ttdeci">void imshow(const String &amp;winname, InputArray mat)</div><div class="ttdoc">Displays an image in the specified window. </div></div>
<div class="ttc" id="namespacecv_html"><div class="ttname"><a href="../../d2/d75/namespacecv.html">cv</a></div><div class="ttdoc">&quot;black box&quot; representation of the file storage associated with a file on disk. </div><div class="ttdef"><b>Definition:</b> affine.hpp:51</div></div>
<div class="ttc" id="group__highgui_html_ga5afdf8410934fd099df85c75b2e0888b"><div class="ttname"><a href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">cv::namedWindow</a></div><div class="ttdeci">void namedWindow(const String &amp;winname, int flags=WINDOW_AUTOSIZE)</div><div class="ttdoc">Creates a window. </div></div>
<div class="ttc" id="group__core__basic_html_ga346f563897249351a34549137c8532a0"><div class="ttname"><a href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">cv::Size</a></div><div class="ttdeci">Size2i Size</div><div class="ttdef"><b>Definition:</b> types.hpp:347</div></div>
<div class="ttc" id="dnn__superres_8hpp_html"><div class="ttname"><a href="../../d3/db0/dnn__superres_8hpp.html">dnn_superres.hpp</a></div></div>
<div class="ttc" id="group__imgproc__hal__functions_html_ga2fe39d2201b12e1b961ca56b2aff9ff2"><div class="ttname"><a href="../../d5/df1/group__imgproc__hal__functions.html#ga2fe39d2201b12e1b961ca56b2aff9ff2">cv::hal::resize</a></div><div class="ttdeci">void resize(int src_type, const uchar *src_data, size_t src_step, int src_width, int src_height, uchar *dst_data, size_t dst_step, int dst_width, int dst_height, double inv_scale_x, double inv_scale_y, int interpolation)</div></div>
<div class="ttc" id="group__highgui__window__flags_html_ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f"><div class="ttname"><a href="../../d0/d90/group__highgui__window__flags.html#ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f">cv::WINDOW_AUTOSIZE</a></div><div class="ttdoc">the user cannot resize the window, the size is constrainted by the image displayed. </div><div class="ttdef"><b>Definition:</b> highgui.hpp:188</div></div>
<div class="ttc" id="imgproc_2include_2opencv2_2imgproc_8hpp_html"><div class="ttname"><a href="../../d1/d4f/imgproc_2include_2opencv2_2imgproc_8hpp.html">imgproc.hpp</a></div></div>
<div class="ttc" id="classcv_1_1Mat_html"><div class="ttname"><a href="../../d3/d63/classcv_1_1Mat.html">cv::Mat</a></div><div class="ttdoc">n-dimensional dense array class </div><div class="ttdef"><b>Definition:</b> mat.hpp:801</div></div>
<div class="ttc" id="classcv_1_1Mat_html_abbec3525a852e77998aba034813fded4"><div class="ttname"><a href="../../d3/d63/classcv_1_1Mat.html#abbec3525a852e77998aba034813fded4">cv::Mat::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdoc">Returns true if the array has no elements. </div></div>
<div class="ttc" id="group__highgui_html_ga5628525ad33f52eab17feebcfba38bd7"><div class="ttname"><a href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv::waitKey</a></div><div class="ttdeci">int waitKey(int delay=0)</div><div class="ttdoc">Waits for a pressed key. </div></div>
</div><!-- fragment --><h2>Explanation </h2>
<ol type="1">
<li><p class="startli"><b>Set header and namespaces</b> </p><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="../../d3/db0/dnn__superres_8hpp.html">opencv2/dnn_superres.hpp</a>&gt;</span></div><div class="line"><span class="keyword">using namespace </span>std;</div><div class="line"><span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"><span class="keyword">using namespace </span>dnn;</div><div class="line"><span class="keyword">using namespace </span>dnn_superres;</div></div><!-- fragment --><p class="startli">If you want you can set the namespace like the code above.</p>
</li>
<li><p class="startli"><b>Create the Dnn Superres object</b> </p><div class="fragment"><div class="line">DnnSuperResImpl sr;</div></div><!-- fragment --><p class="startli">This is just to create the object, register the custom dnn layers and get access to the class functions.</p>
</li>
<li><p class="startli"><b>Read the model</b> </p><div class="fragment"><div class="line">path = <span class="stringliteral">&quot;models/FSRCNN_x2.pb&quot;</span></div><div class="line">sr.readModel(path);</div></div><!-- fragment --><p class="startli">This reads the TensorFlow model from the .pb file. Here 'path' is one of the pre-trained Tensorflow models' path file. You can download the models from OpenCV's GitHub, in the 'dnn_superres' module.</p>
</li>
<li><p class="startli"><b>Set the model</b> </p><div class="fragment"><div class="line">sr.setModel(<span class="stringliteral">&quot;fsrcnn&quot;</span>, 2);</div></div><!-- fragment --><p class="startli">Depending on the model you want to run, you have to set the algorithm and upscale factor. This is to know the desired algorithm and scale, even if you change the .pb file's name. For example: if you chose FSRCNN_x2.pb, your algorithm and scale will be 'fsrcnn' and 2, respectively. (Other algorithm options include "edsr", "espcn" and "lapsrn".)</p>
</li>
<li><p class="startli"><b>Upscale an image</b> </p><div class="fragment"><div class="line">Mat img = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv::imread</a>(img_path);</div><div class="line">Mat img_new;</div><div class="line">sr.upsample(img, img_new);</div></div><!-- fragment --><p class="startli">Now we can upscale any image. Load an image via the standard 'imread' function and create a new Mat for the destination image. Then simple upscale. Your upscaled image is located in 'img_new'.</p>
</li>
</ol>
<h2>An example in python </h2>
<div class="fragment"><div class="line"><span class="keyword">import</span> cv2</div><div class="line"><span class="keyword">from</span> cv2 <span class="keyword">import</span> dnn_superres</div><div class="line"></div><div class="line"><span class="comment"># Create an SR object - only function that differs from c++ code</span></div><div class="line">sr = dnn_superres.DnnSuperResImpl_create()</div><div class="line"></div><div class="line"><span class="comment"># Read image</span></div><div class="line">image = cv2.imread(<span class="stringliteral">&#39;./image.png&#39;</span>)</div><div class="line"></div><div class="line"><span class="comment"># Read the desired model</span></div><div class="line">path = <span class="stringliteral">&quot;EDSR_x4.pb&quot;</span></div><div class="line">sr.readModel(path)</div><div class="line"></div><div class="line"><span class="comment"># Set the desired model and scale to get correct pre- and post-processing</span></div><div class="line">sr.setModel(<span class="stringliteral">&quot;edsr&quot;</span>, 4)</div><div class="line"></div><div class="line"><span class="comment"># Upscale the image</span></div><div class="line">result = sr.upsample(image)</div><div class="line"></div><div class="line"><span class="comment"># Save the image</span></div><div class="line">cv2.imwrite(<span class="stringliteral">&quot;./upscaled.png&quot;</span>, result)</div></div><!-- fragment --><p>Original: </p><div class="image">
<img src="../../input.jpg" alt="input.jpg"/>
</div>
<p> Upscaled Image via FSRCNN: </p><div class="image">
<img src="../../fsrcnnOutput.jpg" alt="fsrcnnOutput.jpg"/>
</div>
<p> Upscaled Image via Bicubic Interpolation: </p><div class="image">
<img src="../../bicubicOutput.jpg" alt="bicubicOutput.jpg"/>
</div>
 </div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:38 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
